package com.jt.service.impl;

import com.jt.dao.MenuMapper;
import com.jt.pojo.Menu;
import com.jt.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class DefaultMenuService implements MenuService {
    /*
        @Cacheable 注解描述的方法为一个缓存切入点查询方法
        这里表示将查询到的结果写入到缓存中
        有redis配置，写入redis缓存中，没有redis配置写入本地缓存
        同样的，还有 @CachePut插入更新方法
     */
    @Autowired
    private MenuMapper menuMapper;

    /*
        因为在存入数据时，很多不同的方法间都有相同的id值，例如之后角色ID
        例如我们下面的方法，使用ID作为key，在缓存中写入内容时无法准确找到写入位置
        所以我们可以使用value作为一个标识，自己命名一个独特的标识
        这样就可以准确的将数据存入redis的缓存中
     */
    @Cacheable(value="menuCache",key = "#id")
    @Override
    public Menu selectById(Long id) {
        return menuMapper.selectById(id);
    }

    @CachePut(value="menuCache",key = "#menu.id")
    @Override
    public Menu insertMenu(Menu menu) {
        menuMapper.insert(menu);
        /*
        * 我们这里执行完insert以后，会将对象持久化到数据库中
        * 同时会将数据库中自增长的ID存储到menu对象中
        * 所以这里返回的menu已经有ID了
        */
        return menu;
    }

    @CachePut(value="menuCache",key = "#menu.id")
    @Override
    public Menu updateMenu(Menu menu) {
        menuMapper.updateById(menu);
        return menu;
    }
}
